// @ts-ignore
import mitt from 'mitt';
/**
 * @typedef {{
 *  on(eventName: string, callback: (evt: Event) => void): void;
 *  emit(eventName: string, data: Record<string, any>): void;
 * }} channel
 */
/**
 * 预置的消息频道，统一维护，不要随意更改
 * @typedef {'default' | 'toast' | 'log'} chName
 */

/**
 * 内置频道
 * @type {Record<chName, channel>} Pre-defined channel list
 */
const channels = {
    'default': mitt(),
    'toast': mitt(),
    'log': mitt(),
};

/**
 * 找到channel的实例
 * @param {chName} ch
 */
function getChannel(ch = 'default') {
    const channel = channels[ch];
    if (!channel) {
        console.error(`No channel named '${ch}'`);
        return null;
    }
    return channel;
}
/**
 * 监听全局消息
 * @param {string} eventName 
 * @param {(evt: Event) => void} callback 
 * @param {chName=} ch
 */
export function listenEvent(eventName, callback, ch) {
    getChannel(ch)?.on(eventName, callback);
}

/**
 * 向消息中心发送消息
 * @param {string} eventName 
 * @param {Record<string, unknown>} data 
 * @param {chName=} ch 频道名称
 */
export function dispatchEvent(eventName, data, ch) {
    getChannel(ch)?.emit(eventName, data);
}
